;*********************************************************** ; DDS 動作チェックプログラム1 ; ;【 テスト内容 】 ; リセット後、確認のため PORTB の LED が1秒間点灯した後、 ; DSS メモリ 1CH に周波数データ(10MHz)を書き込み、それと同 ; 時に10MHzを出力する。(DDSコマンドCの動作テスト) ; ;【 接続ポート 】 ; (DDS) (PIC) ; STB ………RE0 ; DATA………RE1 ; SCK ………RE2 ; ;【 DDS チップセレクト 】 ; CS0 ………1 ; CS1 ………1 ; CS2 ………1 ; ;*********************************************************** LIST P=PIC16F877 ; プロセッサの種別指定 INCLUDE "P16F877.INC" ; インクルードファイルの指定 ;*********************************************************** ; 変数定義とレジスタ割付 ;*********************************************************** COUNT EQU 20H ; ループカウンタ COUNT1 EQU 21H ; ループカウンタ1 COUNT2 EQU 22H ; ループカウンタ2 COUNT3 EQU 23H ; ループカウンタ3 COUNT4 EQU 24H ; ループカウンタ4 TEMP EQU 25H ; 一時保管データ POINT EQU 26H ; テーブルポインタ ;*********************************************************** ; 初期化 ;*********************************************************** ORG 0 ; プログラムの開始番地の指定 BSF STATUS,RP0 ; Bank 1 へ切替 MOVLW B'00000010' ; RE0,RE1,RE2 デジタル入出力 MOVWF ADCON1 ; ADCON1レジスタの設定 CLRF TRISE ; PORTE 全ポートを出力に設定 CLRF TRISB ; PORTB 全ポートを出力に設定 BCF STATUS,RP0 ; Bank 0 へ戻る ;*********************************************************** ; メインプログラム ;*********************************************************** MOVLW B'00000111' ; SCK,DATA,STB = [H],[H],[H] に設定 MOVWF PORTE ; PORTEへ出力(DDSとの通信の初期設定) LED_ON MOVLW B'11111111' ; 11111111 を Wreg にロードする MOVWF PORTB ; PORTBへWregのデータを出力(LEDの全点灯) CALL TIME1S ; 1秒のウエイトを入れる MOVLW B'00000000' ; 00000000 を Wreg にロードする MOVWF PORTB ; PORTBへWregのデータを出力(LEDの消灯) MOVLW 21H ; 21H = 33回繰り返す(DDSとのデータ通信) MOVWF POINT ; テーブルポインタのセット SET_DATA MOVF POINT,W ; テーブルポインタの値をWregへロードする(OFFSET) CALL TABLE ; 周波数データの読み込みサブルーチンへ MOVWF TEMP ; 一時保管データへ BTFSS TEMP,0 ; データが1だったら次の命令をスキップ GOTO DATA_L ; DATA = [L] GOTO DATA_H ; DATA = [H] SET_SCK BCF PORTE,2 ; SCK = [L] NOP ; ポートの誤動作防止 BSF PORTE,2 ; SCK = [H] DECFSZ POINT,F ; テーブルポインタ −1 GOTO SET_DATA ; SET_DATA のラベルへ戻り繰り返す BSF PORTE,1 ; DATA = [H] NOP ; ポートの誤動作防止 BCF PORTE,0 ; STB = [L] NOP ; ポートの誤動作防止 BSF PORTE,0 ; STB = [H] END_LP GOTO END_LP ; DDS 設定終了 DATA_L BCF PORTE,1 ; DATA = [L] GOTO SET_SCK DATA_H BSF PORTE,1 ; DATA = [H] GOTO SET_SCK ;*********************************************************** ; 周波数データテーブル ;*********************************************************** TABLE ; TABLEの定義(PC+OFFSET相当のデータを持って戻る) ADDWF PCL,F ; PC+OFFSET NOP ; ダミーデータ DT 0,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,0,0,0,0,0,0 ; f=10.000000MHz DT 1,1,0,0 ; コマンドC DT 1,1,1 ; CS2,CS1,CS0 = 1,1,1 ;*********************************************************** ;遅延サブルーチン ;*********************************************************** ;100μs遅延サブルーチン(20MHzクロック時) TIME100 MOVLW 0A5H ; 1サイクル A5H=165 MOVWF COUNT ; 1サイクル NOP ; 1サイクル 微調整ダミー NOP ; 1サイクル 微調整ダミー LOOP DECFSZ COUNT,F ; 1×(165-1)+2 = 166サイクル GOTO LOOP ; 2×(165-1) = 328サイクル RETURN ; 2サイクル ;10ms遅延サブルーチン(20MHzクロック時) TIME10M MOVLW 63H ; 1サイクル 63H=99 MOVWF COUNT1 ; 1サイクル NOP ; 1サイクル 微調整ダミー NOP ; 1サイクル 微調整ダミー LOOP1 CALL TIME100 ; (2+500)×99=49698サイクル DECFSZ COUNT1,F ; 1×(99-1)+2 = 100サイクル GOTO LOOP1 ; 2×(99-1) = 196サイクル RETURN ; 2サイクル ;1s遅延サブルーチン(20MHzクロック時) TIME1S MOVLW 63H ; 1サイクル 63H=99 MOVWF COUNT2 ; 1サイクル MOVLW 62H ; 1サイクル 62H=98 MOVWF COUNT3 ; 1サイクル MOVLW 03H ; 1サイクル 03H=3 MOVWF COUNT4 ; 1サイクル NOP ; 1サイクル 微調整ダミー LOOP2 CALL TIME10M ;(2+50000)×99=4950198サイクル DECFSZ COUNT2,F ; 1×(99-1)+2 = 100サイクル GOTO LOOP2 ; 2×(99-1) = 196サイクル LOOP3 CALL TIME100 ;(2+500)×98=49196 DECFSZ COUNT3,F ; 1×(98-1)+2 = 99サイクル GOTO LOOP3 ; 2×(98-1) = 194サイクル LOOP4 DECFSZ COUNT4,F ; 1×(3-1)+2 = 4サイクル GOTO LOOP4 ; 2×(3-1) = 4サイクル RETURN ; 2サイクル END